
/**
 * 
 * for循环是js提出时就有的循环方法。forEach是ES5提出的，挂载在可迭代对象原型上的方法，
 * 例如Array Set Map。
 * 
 * forEach是一个迭代器，负责遍历可迭代对象
 * 
 * for循环和forEach的本质区别。
 * for循环和forEach的语法区别。
 * for循环和forEach的性能区别。
 */

//  可迭代对象：ES6中引入了 iterable 类型，Array Set Map String arguments NodeList 
// 都属于 iterable，他们特点就是都拥有 [Symbol.iterator] 方法，
// 包含他的对象被认为是可迭代的 iterable。


// 本质区别
// forEach 其实是一个迭代器 
// 与 for 循环本质上的区别是 forEach 是负责遍历（Array Set Map）可迭代对象的
// 而 for 循环是一种循环机制，只是能通过它遍历出数组。


// 语法区别
// forEach 的参数。
// forEach 的中断。
// forEach 删除自身元素，index不可被重置。
// for 循环可以控制循环起点。


// 参数传入的是一个回调函数与 回调函数中this的指向
// arr.forEach((item, index, arr) => {}, this)


// forEach 的中断
// 在js中有break return continue 对函数进行中断或跳出循环的操作，
// for循环中会用到一些中断行为，对于优化数组遍历查找是很好的，
// 但由于forEach属于迭代器，只能按序依次遍历完成，所以不支持上述的中断行为。

// forEach 使用 break、continue 会报错，使用return 不报错但不生效 

// 中断方法：借助 try/catch 包裹 forEach


// forEach 删除自身元素，index不可被重置

// let arr = [0 , 1, 2, 3, 4, 5]
// arr.forEach((item, i) => {
//   console.log(i)
//   if (i === 0) {
//     arr.splice(0, 2);
//   }
// })
// console.log(arr);


// for循环和forEach的性能区别

// 性能比较：for > forEach > map

// 原因分析for：
// for循环没有额外的函数调用栈和上下文，所以它的实现最为简单
// forEach：对于forEach来说，它的函数签名中包含了参数和上下文，所以性能会低于 for 循环。
// map：map 最慢的原因是因为 map 会返回一个新的数组，数组的创建和赋值会导致分配内存空间，因此会带来较大的性能开销
